
/*
酷我音乐API

搜索接口
http://search.kuwo.cn/r.s?client=kt&all="+搜索歌曲名+"&pn="+页码+"&rn=30&uid=2505335797&ver=kwplayer_ar_9.2.8.2&vipver=1&show_copyright_off=1&newver=2&correct=1&ft=music&cluster=0&strategy=2012&encoding=utf8&rformat=json&vermerge=1&mobi=1&issubtitle=1
例如
http://search.kuwo.cn/r.s?client=kt&all=可能&pn=0&rn=30&uid=2505335797&ver=kwplayer_ar_9.2.8.2&vipver=1&show_copyright_off=1&newver=2&correct=1&ft=music&cluster=0&strategy=2012&encoding=utf8&rformat=json&vermerge=1&mobi=1&issubtitle=1

音乐ID
取搜索接口源码里的  DC_TARGETID
例如 DC_TARGETID":"221822646","
取 221822646

音乐格式(音质)
取 搜索接口源码里的 MINFO
例如
"MINFO":"level:ff,bitrate:2000,format:flac,size:20.31Mb;level:p,bitrate:320,format:mp3,size:8.31Mb;level:s,bitrate:48,format:aac,size:1.24Mb;level:h,bitrate:128,format:mp3,size:3.32Mb",
从这里可以看出来这首音乐拥有以下音质文件 :
代码   音质   格式    文件大小
2000   无损   flac    20.31Mb
320    高质   mp3      8.31Mb
48     高质   aac      1.24Mb
128    标准   mp3      3.32Mb

音乐链接
http://mobi.kuwo.cn/mobi.s?f=web&source=oppo&type=convert_url_with_sign&rid=+音乐ID+&br=音乐代码k音乐格式
例如 
http://mobi.kuwo.cn/mobi.s?f=web&source=oppo&type=convert_url_with_sign&rid=221822646&br=2000kflac
这个链接最后是 &br=2000kflac 2000是音乐代码  flac是音乐格式  中间用 k 隔开，说明这个是无损音质

在例如
http://mobi.kuwo.cn/mobi.s?f=web&source=oppo&type=convert_url_with_sign&rid=221822646&br=128kmp3
这个链接最后是 &br=128kmp3 128是音乐代码  mp3是音乐格式  中间用 k 隔开，说明这个是标准的音质
其他音质 类推，只需要改链接最后的这两个即可。

音乐直连
取音乐链接的网页源码，取源码用的 
url 为 音乐直连
format 为 音乐的格式


特殊说明
酷我音乐其实抓过几次了，但是每隔一段时间，抓取的接口域名都不一样，有时候之前抓的就不能用了。仅域名有变化，后面参数没有变化，具体情况不太了解。


2024年5月10日
*/


类 酷我音乐 : 窗口

	@布局配置([[根布局=真,宽度=-1,高度=-1,纵向布局=真,背景颜色=-1576716]])
	变量 线性布局1 : 线性布局
	@布局配置([[父布局=线性布局1,宽度=-1,高度DP=45,左内边距DP=18,右内边距DP=18,@上外边距DP=10]])
	变量 相对布局1 : 相对布局
	@布局配置([[父布局=相对布局1,对齐方式=16,内容="酷狗",粗体=真,字体大小=20,字体颜色=-16777216,高度=-1,ID=1]])
	变量 文本框1 : 文本框
	@布局配置([[父布局=相对布局1,高度=-1,内容="下载器",对齐方式=16,@位于某组件右边=1,@左外边距DP=1,纵向偏移DP=2,字体大小=16,粗体=真]])
	变量 文本框2 : 文本框
	@布局配置([[父布局=相对布局1,高度=-1,@位于布局右边=真,对齐方式=17,可视=假]])
	变量 线性布局2 : 线性布局
	@布局配置([[父布局=线性布局2,宽度DP=21,高度DP=21]])
	变量 图片框1 : 图片框
	@布局配置([[父布局=线性布局1,宽度=-1,高度=-2,对齐方式=1,纵向布局=真,左内边距DP=20,右内边距DP=20,上内边距DP=10]])
	变量 线性布局3 : 线性布局
	@布局配置([[父布局=线性布局3,宽度=-1,高度DP=40,圆角=75,卡片阴影=0,@下外边距DP=15]])
	变量 卡片布局1 : 卡片布局
	@布局配置([[父布局=卡片布局1,宽度=-1,高度=-1,透明度=1.0,背景颜色=-328966]])
	变量 线性布局4 : 相对布局
	@布局配置([[父布局=线性布局4,宽度=-1,高度=-1,左内边距DP=15,右内边距DP=3,上内边距DP=2,下内边距DP=2,@位于某组件左边=1]])
	变量 线性布局8 : 线性布局
	@布局配置([[父布局=线性布局8,宽度=-1,高度=-1,内边距=0,背景颜色=16777215,提示文本="输入搜索内容",单行输入=真,对齐方式=16,字体颜色=-16777216,单行显示=真,字体大小=16,粗体=真,内容="",显示光标=真]])
	变量 输入搜索内容 : 编辑框
	@布局配置([[父布局=线性布局4,宽度DP=60,高度=-1,ID=1,@位于布局左边=假,@位于布局右边=真]])
	变量 搜索按钮 : 相对布局
	@布局配置([[父布局=搜索按钮,圆角=75,卡片阴影=0,宽度=-1,横向偏移DP=-3,高度DP=35,@位于布局中间=真,@位于布局左边=假,@位于布局右边=真]])
	变量 卡片布局4 : 卡片布局
	@布局配置([[父布局=卡片布局4,宽度=-1,高度=-1,背景颜色=-11433996]])
	变量 线性布局7 : 线性布局
	@布局配置([[父布局=搜索按钮,圆角=0,卡片阴影=0,高度DP=35,@位于布局中间=真,背景颜色=-11433996,@位于布局右边=假,宽度DP=25,@位于布局左边=真]])
	变量 卡片布局5 : 卡片布局
	@布局配置([[父布局=搜索按钮,@位于布局中间=真,@位于布局右边=假,内容="搜索",粗体=真,字体大小=17,@右外边距DP=5,字体颜色=-1,@位于布局左边=假,横向偏移DP=-2]])
	变量 文本框3 : 文本框
	@布局配置([[父布局=线性布局1,宽度=-1,高度=-1,左内边距DP=20,右内边距DP=20]])
	变量 线性布局5 : 线性布局
	@布局配置([[父布局=线性布局5,宽度=-1,高度=-1,启用下拉刷新功能=假,启用上拉加载功能=假]])
	变量 智能刷新布局1 : 智能刷新布局
	@布局配置([[父布局=智能刷新布局1,宽度=-1,高度=-1,显示滑块条=假,始终显示快速滚动条=假,列数=1]])
	变量 自定义宫格列表框1 : 自定义宫格列表框

	变量 页码:整数=0
	变量 关键词:文本="抖音"
	变量 网络工具1:网络工具
	变量 网络工具2:网络工具
	变量 标题集合:文本集合
	变量 链接集合:文本集合
	变量 歌手集合:文本集合
	变量 当前角度:整数=0
	变量 音乐播放器1:音乐播放器
	事件 酷我音乐:创建完毕()
		本对象.屏幕方向 = 1
		本对象.显示标题栏 =假
		本对象.状态栏字体黑色 = 真
		本对象.状态栏颜色 = -1576716
		本对象.导航栏颜色 = -1576716
		申请所有权限()
		订阅事件()
		开始搜索()
	结束 事件


	方法 开始搜索()
		网络工具1.取网页源码("http://search.kuwo.cn/r.s?client=kt&all="+关键词+"&pn="+页码.到文本()+"&rn=30&uid=2505335797&ver=kwplayer_ar_9.2.8.2&vipver=1&show_copyright_off=1&newver=2&correct=1&ft=music&cluster=0&strategy=2012&encoding=utf8&rformat=json&vermerge=1&mobi=1&issubtitle=1")
	结束 方法

	事件 搜索按钮:被单击()
		智能刷新布局1.结束加载()
		如果 输入搜索内容.内容==""则
			弹出提示("请输入关键词")
		否则
			标题集合.清空()
			链接集合.清空()
			歌手集合.清空()
			自定义宫格列表框1.更新项目(标题集合.长度())
			页码=0
			关键词=输入搜索内容.内容
			开始搜索()
		结束 如果
	结束 事件

	事件 智能刷新布局1:上拉加载事件()
		页码=页码+1
		开始搜索()
	结束 事件

	事件 网络工具1:取网页源码结束(结果 : 文本,内容 : 字节[],cookie : 文本)
		智能刷新布局1.启用上拉加载功能 = 真
		智能刷新布局1.结束加载()
		变量 音乐歌单结果对象:JSON对象=结果
		变量 音乐歌单结果数组:JSON数组=音乐歌单结果对象.取JSON数组("abslist")
		循环(音乐歌单索引, 0, 音乐歌单结果数组.长度())
			标题集合.添加成员(音乐歌单结果数组.取JSON对象(音乐歌单索引).取文本("NAME"))
			链接集合.添加成员(音乐歌单结果数组.取JSON对象(音乐歌单索引).取文本("DC_TARGETID"))
			歌手集合.添加成员(音乐歌单结果数组.取JSON对象(音乐歌单索引).取文本("FARTIST"))
		结束 循环
		提交到主线程运行(本对象)
		自定义宫格列表框1.更新项目(标题集合.长度())
		结束提交到主线程()
	结束 事件
	事件 自定义宫格列表框1:加载布局(索引 : 整数,项目布局 : 组件容器) : 组件容器
		变量 音乐项目布局1:音乐项目布局
		音乐项目布局1.音乐名称.内容=标题集合[索引]
		音乐项目布局1.音乐歌手.内容=歌手集合[索引]
		音乐项目布局1.音乐序号.内容=(索引+1).到文本()
		假如 索引
			是 0
				音乐项目布局1.音乐序号图片.图片资源 = "../../../素材/Png/music_list_1.png"
			是 1
				音乐项目布局1.音乐序号图片.图片资源 = "../../../素材/Png/music_list_2.png"
			是 2
				音乐项目布局1.音乐序号图片.图片资源 = "../../../素材/Png/music_list_3.png"
		结束 假如
		事件 音乐项目布局1.音乐下载按钮:被单击()
			变量 等待框1 : DX加载
			变量 下载弹窗:DX底部菜单
			下载弹窗.列表({"下载标准","下载无损","取消选择"})
			下载弹窗.显示()
			事件 下载弹窗:列表被点击(底部选择索引 : 整数,内容 : 文本) : 逻辑型
				下载弹窗.关闭()
				假如 底部选择索引
					是 0
						网络工具2.取网页源码("http://mobi.kuwo.cn/mobi.s?f=web&source=oppo&type=convert_url_with_sign&rid="+链接集合[索引]+"&br=128kmp3")
						等待框1.内容("正在下载")
						等待框1.显示()
					是 1
						网络工具2.取网页源码("http://mobi.kuwo.cn/mobi.s?f=web&source=oppo&type=convert_url_with_sign&rid="+链接集合[索引]+"&br=2000kflac")
						等待框1.内容("正在下载")
						等待框1.显示()
				结束 假如
				事件 网络工具2:取网页源码失败()
					提交到新线程运行()
					等待框1.类型(DX加载.类型_错误)
					等待框1.内容("下载失败")
					延时(1800)
					等待框1.关闭()
					结束提交到新线程()
				结束 事件
				事件 网络工具2:取网页源码结束(结果 : 文本,内容 : 字节[],cookie : 文本)
					变量 音乐直连对象:JSON对象=结果
					如果 音乐直连对象.取整数("code")==200 则
						变量 音乐下载直连:文本=音乐直连对象.取JSON对象("data").取文本("url")
						变量 音乐下载格式:文本=音乐直连对象.取JSON对象("data").取文本("format")
						网络工具1.下载(音乐下载直连,取存储卡路径()+"/"+全局配置.软件名称+"/蓝莓音乐/"+标题集合[索引]+"."+音乐下载格式)
						事件 网络工具1:正在下载(进度 : 小数)
							等待框1.进度(进度/100)
						结束 事件
						事件 网络工具1:下载结束(cookie : 文本)
							提交到新线程运行()
							等待框1.类型(DX加载.类型_成功)
							等待框1.内容("下载成功")
							延时(1800)
							等待框1.关闭()
							结束提交到新线程()
						结束 事件
					否则
						提交到新线程运行()
						等待框1.类型(DX加载.类型_错误)
						等待框1.内容("下载失败")
						延时(1800)
						等待框1.关闭()
						结束提交到新线程()
					结束 如果
				结束 事件 
				返回 假
			结束 事件
		结束 事件
		事件 音乐项目布局1.音乐播放按钮:被单击()
			变量 时钟1:时钟
			变量 时钟2:时钟
			当前角度=0
			变量 播放弹窗:DX全屏对话框
			变量 播放弹窗布局1:播放弹窗布局

			播放弹窗布局1.歌曲名称.内容 = 标题集合[索引]
			播放弹窗布局1.歌手名称.内容 = 歌手集合[索引]
			播放弹窗.自定义布局(播放弹窗布局1)
			播放弹窗.可取消(真)
			播放弹窗.圆角(45)
			播放弹窗.显示()
			音乐播放器1.停止播放()
			变量 网络工具3:网络工具
			网络工具3.取网页源码("http://mobi.kuwo.cn/mobi.s?f=web&source=oppo&type=convert_url_with_sign&rid="+链接集合[索引]+"&br=128kmp3")

			事件 网络工具3:取网页源码结束(结果 : 文本,内容 : 字节[],cookie : 文本)
				变量 音乐直连对象:JSON对象=结果
				变量 音乐下载直连:文本=音乐直连对象.取JSON对象("data").取文本("url")
				音乐播放器1.置播放路径(音乐下载直连)
				音乐播放器1.开始播放()
				时钟1.时钟周期 = 1000
				时钟2.时钟周期 = 30
				播放弹窗布局1.音乐时长.内容=时间戳到文本(音乐播放器1.取音乐总时长(),"mm:ss")
				事件 播放弹窗布局1.进度条背景:被触摸(来源事件 : 触摸事件) : 逻辑型
					变量 进度1 :整数 =来源事件.取横坐标().到整数()
					变量 快进 : 整数 =(音乐播放器1.取音乐总时长()*进度1/播放弹窗布局1.进度条背景.宽度)

					如果 来源事件.动作 ==触摸动作.移动 则
						如果 进度1 > 播放弹窗布局1.进度条背景.宽度 则
							播放弹窗布局1.进度条前景.宽度 = 播放弹窗布局1.进度条背景.宽度
							播放弹窗布局1.滑动块.横坐标 = 播放弹窗布局1.进度条前景.横坐标+播放弹窗布局1.进度条背景.宽度+80
							播放弹窗布局1.已播放.内容 = 时间戳到文本(音乐播放器1.取音乐总时长(),"mm:ss")
						否则 进度1 < 1
							播放弹窗布局1.进度条前景.宽度 = 1
							播放弹窗布局1.滑动块.横坐标 = 80
							播放弹窗布局1.已播放.内容 = "00:00"
						否则
							播放弹窗布局1.进度条前景.宽度 = 进度1
							播放弹窗布局1.滑动块.横坐标 = 播放弹窗布局1.进度条前景.横坐标+进度1+80
							播放弹窗布局1.已播放.内容 = 时间戳到文本(快进,"mm:ss")
						结束 如果
						音乐播放器1.暂停播放()
						音乐播放器1.快进至(快进)
						音乐播放器1.开始播放()
					结束 如果

					如果 来源事件.动作 ==触摸动作.按下 则
						如果 进度1 > 播放弹窗布局1.进度条背景.宽度 则
							播放弹窗布局1.进度条前景.宽度 = 播放弹窗布局1.进度条背景.宽度
							播放弹窗布局1.滑动块.横坐标 = 播放弹窗布局1.进度条前景.横坐标+播放弹窗布局1.进度条背景.宽度+80
							播放弹窗布局1.已播放.内容 = 时间戳到文本(音乐播放器1.取音乐总时长(),"mm:ss")
						否则 进度1 < 1
							播放弹窗布局1.进度条前景.宽度 = 1
							播放弹窗布局1.滑动块.横坐标 = 80
							播放弹窗布局1.已播放.内容 = "00:00"
						否则
							播放弹窗布局1.进度条前景.宽度 = 进度1
							播放弹窗布局1.滑动块.横坐标 = 播放弹窗布局1.进度条前景.横坐标+进度1+80
							播放弹窗布局1.已播放.内容 = 时间戳到文本(快进,"mm:ss")
						结束 如果
						音乐播放器1.暂停播放()
						音乐播放器1.快进至(快进)
						音乐播放器1.开始播放()
					否则

					结束 如果
					返回 真
				结束 事件

				事件 播放弹窗:返回键被单击() : 逻辑型
					时钟1.时钟周期 = 0
					时钟2.时钟周期 = 0
					播放弹窗.关闭()
					返回 假
				结束 事件 
				事件 时钟1:周期事件()
					如果 音乐播放器1.是否在播放() == 真 则
						变量 进度 :整数 =(音乐播放器1.取当前播放位置()*播放弹窗布局1.进度条背景.宽度/音乐播放器1.取音乐总时长())
						播放弹窗布局1.进度条前景.宽度 = 进度
						播放弹窗布局1.滑动块.横坐标 = 播放弹窗布局1.进度条前景.横坐标+进度+80
						播放弹窗布局1.已播放.内容 = 时间戳到文本(音乐播放器1.取当前播放位置(),"mm:ss")
						播放弹窗布局1.音乐时长.内容 = 时间戳到文本(音乐播放器1.取音乐总时长(),"mm:ss")
						播放弹窗布局1.播放暂停按钮.图片资源 = "../../../素材/Png/dj1.png"
					否则
						播放弹窗布局1.播放暂停按钮.图片资源 = "../../../素材/Png/dj2.png"
					结束 如果
				结束 事件
				事件 播放弹窗布局1.播放暂停按钮:被单击()
					如果 音乐播放器1.是否在播放() == 真 则
						时钟1.时钟周期 = 0
						时钟2.时钟周期 = 0
						音乐播放器1.暂停播放()
						播放弹窗布局1.播放暂停按钮.图片资源 = "../../../素材/Png/dj2.png"
					否则
						音乐播放器1.开始播放()
						播放弹窗布局1.播放暂停按钮.图片资源 = "../../../素材/Png/dj1.png"
						时钟1.时钟周期 = 1000
						时钟2.时钟周期 = 30
					结束 如果
				结束 事件
				事件 时钟2:周期事件()
					如果 音乐播放器1.是否在播放()==真 则
						如果 当前角度==359 则
							当前角度=0
						否则
							当前角度=当前角度+1
						结束 如果
						播放弹窗布局1.圆形图片框1.旋转角 = 当前角度
					结束 如果
				结束 事件

				事件 播放弹窗布局1.下一曲按钮:被单击()
					如果 索引==标题集合.长度 则
						弹出提示("已经没有更多了")
					否则
						时钟1.时钟周期 = 0
						时钟2.时钟周期 = 0
						如果 音乐播放器1.是否在播放() == 真 则
							音乐播放器1.停止播放()
							播放弹窗布局1.播放暂停按钮.图片资源 = "../../../素材/Png/dj2.png"
							当前角度=0
							播放弹窗布局1.歌曲名称.内容 = 标题集合[索引+1]
							播放弹窗布局1.歌手名称.内容 = 歌手集合[索引+1]
							网络工具3.取网页源码("http://mobi.kuwo.cn/mobi.s?f=web&source=oppo&type=convert_url_with_sign&rid="+链接集合[索引+1]+"&br=128kmp3")
						否则
							播放弹窗布局1.播放暂停按钮.图片资源 = "../../../素材/Png/dj1.png"
							当前角度=0
							播放弹窗布局1.歌曲名称.内容 = 标题集合[索引+1]
							播放弹窗布局1.歌手名称.内容 = 歌手集合[索引+1]
							网络工具3.取网页源码("http://mobi.kuwo.cn/mobi.s?f=web&source=oppo&type=convert_url_with_sign&rid="+链接集合[索引+1]+"&br=128kmp3")
						结束 如果
					结束 如果
				结束 事件
				事件 播放弹窗布局1.上一曲按钮:被单击()
					如果 索引==0 则
						弹出提示("已经没有更多了")
					否则
						时钟1.时钟周期 = 0
						时钟2.时钟周期 = 0
						如果 音乐播放器1.是否在播放() == 真 则
							音乐播放器1.停止播放()
							播放弹窗布局1.播放暂停按钮.图片资源 = "../../../素材/Png/dj2.png"
							当前角度=0
							播放弹窗布局1.歌曲名称.内容 = 标题集合[索引-1]
							播放弹窗布局1.歌手名称.内容 = 歌手集合[索引-1]
							网络工具3.取网页源码("http://mobi.kuwo.cn/mobi.s?f=web&source=oppo&type=convert_url_with_sign&rid="+链接集合[索引-1]+"&br=128kmp3")
						否则
							播放弹窗布局1.播放暂停按钮.图片资源 = "../../../素材/Png/dj1.png"
							当前角度=0
							播放弹窗布局1.歌曲名称.内容 = 标题集合[索引-1]
							播放弹窗布局1.歌手名称.内容 = 歌手集合[索引-1]
							网络工具3.取网页源码("http://mobi.kuwo.cn/mobi.s?f=web&source=oppo&type=convert_url_with_sign&rid="+链接集合[索引-1]+"&br=128kmp3")
						结束 如果
					结束 如果
				结束 事件
			结束 事件
		结束 事件
		返回 音乐项目布局1
	结束 事件

	@虚拟方法
	方法 返回键被按下()
		音乐播放器1.停止播放()
		父对象.返回键被按下()
	结束 方法
	
	
结束 类